package nfes.the.main;

import java.util.ArrayList;
import java.util.List;

import nfes.the.classes.Cabecalho;
import nfes.the.classes.Deducao;
import nfes.the.classes.EnvioLoteRPS;
import nfes.the.classes.Item;
import nfes.the.classes.Lote;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.CompactWriter;
import com.thoughtworks.xstream.io.xml.DomDriver;
import java.io.StringWriter;
import java.security.NoSuchAlgorithmException;
import java.util.logging.Level;
import java.util.logging.Logger;
import nfes.the.classes.RPS;
import nfes.the.util.Constantes;
import nfes.the.util.Util;

/**
 * @author Julianna Paz
 */
//colocar id nas tag
public class GerarXML {

    public static void main(String args[]) throws NoSuchAlgorithmException {

        String nomeArquivoEnvioLote = "EnvioLote" + Util.dataHoje();
        String nomeArquivoEnvioLoteAssinado = "EnvioLoteAssinado" + Util.dataHoje() + ".xml";

        Cabecalho cabecalho = new Cabecalho(1219, //codigo Cidade
                "02646676000182", //cPFCNPJRemetente
                "Auto Estudio LTDA", //Razão Social
                "2010-04-08", //dt Inicio
                "2010-04-08", //dt Fim
                3, //qtdRPS
                135.53, //valorTotalServicos
                6.43, //valorTotalDeducoes
                ""); //transacao

        Deducao d = new Deducao("Percentual", "", "01354365321", 234, 20.39, 5.0, 2.9);
        Deducao d1 = new Deducao("Valor", "", "01354365321", 876, 19.59, 4.0, 2.1);
        List<Deducao> deducoes = new ArrayList<>();
//        deducoes.add(d);
//        deducoes.add(d1);
        Item i = new Item("Lavagem de Carro", 1.0, 50.0, 50.0);
        Item i1 = new Item("Polimento", 2.0, 150.0, 300.0);
        List<Item> itens = new ArrayList<>();
        itens.add(i);
        itens.add(i1);

        //O rps:valor precisa ser incrementado, baseado no número do último RPS enviado
        RPS rps = new RPS("rps:172", //id
                "0370835", //inscricaoMunicipalPrestador
                "AUTO ESTUDIO LTDA", //razaoSocialPrestador
                "RPS", // tipoRPS
                "NF", // serieRPS
                172, //numeroRPS
                "2015-05-09T16:08:55", //dataEmissaoRPS
                "N", //situacaoRPS
                "99", //seriePrestacao
                "01354365321", //cPFCNPJTomador
                "Julianna Paz", //razaoSocialTomador
                "Rua", // tipoLogradouroTomador
                "Endereco", //logradouroTomador
                "06", //numeroEnderecoTomador
                "Nao Tem", //complementoEnderecoTomador
                "Bairro", //tipoBairroTomador
                "Itarare", //bairroTomador
                87, //cidadeTomador
                "Teresina", //cidadeTomadorDescricao
                "652544", //cEPTomador
                "hoje@hoje.com.br", //emailTomador
                "869099900", // codigoAtividade ??
                0.0, // aliquotaAtividade
                "A", // tipoRecolhimento Tipo de Recolhimento “A” – A Recolher “R” - Retido na Fonte
                1219, // municipioPrestacao
                "Teresina", // municipioPrestacaoDescricao
                "A", // operacao A-Sem Dedução B-Com Dedução/Materiais C-Imune/Isenta de ISSQN D-Devolução / Simples Remessa J-Intermediação*
                "T", // tributacao C - Isenta de ISS E - Não Incidência no Município F - Imune K - Exigibilidd Susp. Dec.J/Proc.A N - Não Tributável 
                //T – Tributável G - Tributável Fixo H - Tributável S.N. M – Micro Empreendedor Individual (MEI)
                "", //descricaoRPS
                //deducoes, //Lista de deduções
                itens, // Lista de Itens
                0.0, // valorPis
                0.0, // valorCofins
                0.0, // valorInss
                0.0, // valorIr
                0.0, // valorCsll
                0.0, // aliquotaPis
                0.0, // aliquotaCofins
                0.0, // aliquotaInss
                0.0, // aliquotaIr
                0.0, // aliquotaCsll
                "86", //dddPrestador
                "88595467", //telefonePrestador
                "89", //dddTomador
                "77657865");//telefoneTomador

        //Assinando o RPS
        String assinatura = Util.sha1(Util.montarTextoParaAssinatura(rps.getInscricaoMunicipalPrestador(), rps.getSerieRPS(), rps.getNumeroRPS(), rps.getDataEmissaoRPS(), rps.getTributacao(),
                rps.getSituacaoRPS(), rps.getTipoRecolhimento(), Util.doubleEmInteiro(cabecalho.getValorTotalServicos()), Util.doubleEmInteiro(cabecalho.getValorTotalDeducoes()), rps.getCodigoAtividade(), rps.getCPFCNPJTomador()));
        rps.setAssinatura(assinatura);
        System.out.println("Assinatura:>> " + assinatura);
        List<RPS> RPS = new ArrayList<>();
        RPS.add(rps);

        Lote lote = new Lote(RPS, "lote:1ABCDZ");
        EnvioLoteRPS reqEnvioLoteRPS = new EnvioLoteRPS(cabecalho, lote);

        gerarXmlBean(reqEnvioLoteRPS, nomeArquivoEnvioLote);

        try {
            Util.gerarAssinaturaLote(Constantes.caminhoArquivoEnvio + nomeArquivoEnvioLote + ".xml",
                    Constantes.caminhoArquivoEnvio + nomeArquivoEnvioLoteAssinado, "Lote", "lote:1ABCDZ", "ns1:ReqEnvioLoteRPS");
        } catch (Exception ex) {
            Logger.getLogger(GerarXML.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static void gerarXmlBean(Object objeto, String nomeArquivo) {
        XStream xStream = new XStream(new DomDriver("UTF-8"));
        String encoding = "<?xml version=\"1.0\" encoding=\"utf-8\"?> \n";
        xStream.aliasAttribute("xmlns:ns1", "ns1");
        xStream.aliasAttribute("xmlns:tipos", "tipos");
        xStream.aliasAttribute("xmlns:xsi", "xmnlsXsi");
        xStream.aliasAttribute("xsi:schemaLocation", "xsiSchemaLocation");
        xStream.aliasAttribute("Id", "idLote");
        xStream.aliasAttribute("Id", "IdRps");
        xStream.useAttributeFor(EnvioLoteRPS.class, "ns1");
        xStream.useAttributeFor(EnvioLoteRPS.class, "tipos");
        xStream.useAttributeFor(EnvioLoteRPS.class, "xmnlsXsi");
        xStream.useAttributeFor(EnvioLoteRPS.class, "xsiSchemaLocation");
        xStream.useAttributeFor(Lote.class, "idLote");
        xStream.useAttributeFor(RPS.class, "IdRps");
        xStream.autodetectAnnotations(true);
        StringWriter sw = new StringWriter();
        xStream.marshal(objeto, new CompactWriter(sw));
        Util.gerarArquivo(Constantes.caminhoArquivoEnvio, nomeArquivo, "xml", encoding + sw.toString());
    }
}
